﻿using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Net;
using System.Net.Sockets;

namespace Warehouse.API
{
    public class ExceptionFilter: IExceptionFilter
    {

        private readonly ILogger<ExceptionFilter> _logger;
        private static readonly string Hostname;
        private static readonly string IpAddress;


        static ExceptionFilter()
        {
            Hostname = Dns.GetHostName();
            var hostentry = Dns.GetHostEntry(Hostname);
            var ipaddress = hostentry.AddressList.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork);
            IpAddress = ipaddress?.ToString()?? "未知的IP地址";
        }


        public ExceptionFilter(ILogger<ExceptionFilter> logger)
        {
            _logger = logger;
        }

        public void OnException(ExceptionContext context)
        {
            //获取异常信息
            var exception = context.Exception;
            var exeprionMessage = exception.Message;
            var stackTrace = exception.StackTrace;

            //获取请求信息
            var requestPath  = context.HttpContext.Request.Path;
            var requestMethod = context.HttpContext.Request.Method;

            _logger.LogError("异常发生\n+" +
                $"主机名：{Hostname}\n"+
                $"IP地址：{IpAddress}\n"+
                $"请求路径：{requestPath}\n"+
                $"请求方法：{requestMethod}\n"+
                $"异常信息：{exeprionMessage}\n"+
                $"堆栈跟踪：{stackTrace?.Substring(0,50)}");

            //返回错误信息
            var errReponse = new ApiResult<string>
            {
                Code = -1,
                Message = "服务器内部错误，请稍后再试",
            };
            context.Result = new JsonResult(errReponse);

            context.ExceptionHandled = true;

        }



    }
}
